🔢 데이터의 표현과 컴퓨터 연산
컴퓨터가 숫자·문자 같은 데이터를 어떻게 비트로 표현하고, 그 위에서 연산을 어떻게 수행하는지 정리합니다.
1️⃣ 데이터 표현의 기본 단위
| 단위 | 크기 | 설명 |
|---|---|---|
| 비트 (Bit) | 1비트 | 0 또는 1, 데이터 표현의 최소 단위 |
| 니블 (Nibble) | 4비트 | 16진수 한 자리를 표현하기 딱 맞는 크기 |
| 바이트 (Byte) | 8비트 | 문자 하나를 표현하는 기본 단위 |
| 워드 (Word) | 보통 32비트 또는 64비트 | CPU가 한 번에 처리하는 데이터 단위, CPU 아키텍처에 따라 다름 |
2️⃣ 진법과 변환
컴퓨터는 내부적으로 2진법을 사용하지만, 사람이 다루기엔 자리수가 너무 길어 8진법·16진법을 함께 사용합니다.
- 10진수 → 2진수: 몫이 0이 될 때까지 2로 나누고, 나머지를 거꾸로 읽음
- 2진수 → 16진수: 뒤에서부터 4비트씩 묶어 각각을 16진수 한 자리로 변환 (16 = 2⁴이기 때문에 딱 맞아떨어짐)
2진수: 1101 1010
4비트씩: 1101 | 1010
16진수: D | A → 0xDA
3️⃣ 정수의 표현 - 음수를 비트로 어떻게 나타낼까
| 방식 | 음수 표현 방법 | 문제점 |
|---|---|---|
| 부호화 절대값 | 최상위 비트를 부호로, 나머지를 절댓값으로 표현 | +0과 -0이 따로 존재 |
| 1의 보수 | 모든 비트를 반전 | +0과 -0이 따로 존재 |
| 2의 보수 | 1의 보수에 1을 더함 | 0이 하나만 존재, 현재 대부분의 컴퓨터가 채택 |
🔹 왜 2의 보수를 쓸까
- 0이 단 하나만 존재해 표현이 깔끔함
- 뺄셈을 덧셈 회로만으로 처리할 수 있음 →
A - B를A + (B의 2의 보수)로 계산 가능해, CPU에 별도의 뺄셈 회로를 만들 필요가 없음
4️⃣ 실수의 표현 - 부동소수점 (IEEE 754)
- 고정소수점: 소수점 위치를 정수부/소수부 비트 수로 고정. 구현은 단순하지만 표현 가능한 범위가 좁음
- 부동소수점: 부호(Sign) + 지수(Exponent) + 가수(Mantissa)로 구성해, 소수점 위치를 "떠다니게" 만들어 훨씬 넓은 범위를 표현
[ 부호(1bit) | 지수부 | 가수부 ]
- 지수부로 소수점의 위치(스케일)를, 가수부로 유효숫자를 표현
- 2진수로는 10진수 소수를 정확히 표현하지 못하는 경우가 있어 **반올림 오차(정밀도 손실)**가 발생
- 자바스크립트에서
0.1 + 0.2 !== 0.3이 나오는 이유가 바로 이 부동소수점 표현의 한계 때문
- 자바스크립트에서
5️⃣ 컴퓨터의 연산
🔹 보수를 이용한 뺄셈
4비트 기준으로 5 - 3을 2의 보수 덧셈으로 계산하면:
5 = 0101
-3(2의 보수) = 1101 (3 = 0011 → 반전 1100 → +1 → 1101)
0101
+ 1101
-------
10010 → 4비트만 취하면 0010 = 2 (올림수는 버림)
🔹 시프트 연산
5 << 1; // 10 → 왼쪽으로 1비트 이동 = ×2
5 >> 1; // 2 → 오른쪽으로 1비트 이동 = ÷2 (몫)
- 곱셈/나눗셈 회로보다 훨씬 단순한 시프트 연산으로 2의 거듭제곱 배 연산을 빠르게 처리
🔹 오버플로우
- 연산 결과가 표현 가능한 비트 수의 범위를 벗어나는 현상
- 2의 보수 체계에서는 두 양수를 더했는데 결과가 음수로 나오는 경우 등으로 오버플로우를 감지할 수 있음
✍️ 한 줄 정리
컴퓨터는 모든 데이터를 비트로 표현하며, 정수의 음수는 2의 보수로 나타내 덧셈 회로만으로 뺄셈까지 처리하고, 실수는 부동소수점(IEEE 754)으로 넓은 범위를 표현하는 대신 정밀도 손실을 감수한다.